package com.yt.system.service.impl;

import com.yt.system.dao.ApplyresourceMapper;
import com.yt.system.dao.ResourceMapper;
import com.yt.system.domain.Applyresource;
import com.yt.system.domain.Resource;
import com.yt.system.service.ResourceService;
import com.yt.system.vo.OccupyResourceVO;
import com.yt.system.vo.UserApplyResourceVO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Date;
import java.util.List;

@Service
public class ResourceServiceImpl implements ResourceService{
    @Autowired
    ResourceMapper resourceMapper;

    @Autowired
    ApplyresourceMapper applyresourceMapper;

    /**
     * 查看资源申请记录(按照选择的资源rid)
     * @param rid
     * @return
     */
    @Override
    public List<OccupyResourceVO> selectByRid(Integer rid) {
        return applyresourceMapper.selectByRid(rid);
    }

    /**
     * 查看本用户相关的资源（0申请的/1通过申请的/2提交归还的/3已归还的/4超时的）
     * @param uid
     * @return
     */
    @Override
    public List<UserApplyResourceVO> selectByUid(Integer uid) {
        return applyresourceMapper.selectByUid(uid);
    }

    /**
     * 申请资源
     * @param record
     * @return
     */
    @Override
    public boolean applyResource(Applyresource record) {
        //判断是否可申请，默认为flase
        boolean flag = false;
        //离用户申请时间最近的占用开始时间
        Date startTime = null;
        //查询是否存在这一个时间：
        //1、存在，判断占用开始时间是否比申请结束时间要晚，是，则改变申请标志位为true
        //2、不存在，表示这次申请的时间段后面没有资源占用情况，可以申请，改变标志位为true
        startTime = applyresourceMapper.selectAvailableTime(record.getArstarttime(),record.getArrid());
        if(startTime!=null){
            if(record.getArendtime().getTime() <= startTime.getTime()){
                flag = true;
            }
        }else {
            flag = true;
        }
        //判断申请标志位，true可申请，false不可申请
        if(flag){
            record.setFlag(0);
            //执行插入，返回大于0的数表示插入申请记录成功，0则插入失败
            if (applyresourceMapper.insertSelective(record)>0){
                return true;
            }else {
                return false;
            }
        }
        return false;
    }

    /**
     * 归还资源（状态为1通过申请的数据才可以归还 先不实现：通知管理员 ）
     * @param arid
     * @return
     */
    @Override
    public Boolean returnResource(Integer arid) {
        boolean isSuccess = false;
        Applyresource applyresource = null;
        //根据arid查询相关记录
        applyresource = applyresourceMapper.selectByPrimaryKey(arid);
        //若是存在，判断标志位是否为1（以借用），若是修改为2（申请归还）
        //修改成功，则返回true
        if (applyresource != null){
            if (applyresource.getFlag() == 1){
                applyresource.setFlag(2);
                if (applyresourceMapper.updateByPrimaryKeySelective(applyresource) > 0){
                    isSuccess = true;
                }
            }
        }
        //不成功的理由该ID的记录不可归还
        return isSuccess;
    }

    @Override
    public Boolean checkResource(Integer arid) {
        boolean isSuccess = false;
        Applyresource applyresource = null;
        //根据arid查询相关记录
        applyresource = applyresourceMapper.selectByPrimaryKey(arid);
        //若是存在，判断标志位是否为0（申请借用），若是修改为1（以借用）
        //修改成功，则返回true
            if (applyresource.getFlag() == 0){
                applyresource.setFlag(1);
                if (applyresourceMapper.updateByPrimaryKeySelective(applyresource) > 0){
                    isSuccess = true;
                }
            }
        //不成功的理由该ID的记录审核不通过
        return isSuccess;
    }

    /**
     * 取消申请（状态为0申请的数据才可以取消 先不实现：通知管理员 ）
     * @param arid
     * @return
     */
    @Override
    public Boolean cancelApply(Integer arid) {
        boolean cancleSuccess = false;
        Applyresource applyresource = null;
        //查询该ID相应的记录
        applyresource = applyresourceMapper.selectByPrimaryKey(arid);
        //若是不为空，判断状态是否为0等待审核
        //只有状态为0才可以取消申请
        //若符合则删除该记录，返回true
        if (applyresource != null){
            if (applyresource.getFlag() == 0){
                applyresourceMapper.deleteByPrimaryKey(arid);
                cancleSuccess = true;
            }
        }
        //不成功的理由，该ID相应的记录不能进行删除操作
        return cancleSuccess;
    }

    /**
     * 查询所有类型
     * @return
     */
    @Override
    public List<Integer> selectResourceType() {
        return resourceMapper.selectResourceType();
    }

    @Override
    public List<Resource> findAllResource() {
        return resourceMapper.findAllResource();
    }

    @Override
    public List<Resource> selectResourceByType(Integer type) {
        List<Resource> resources = resourceMapper.selectResourceByType(type);
        return resources;
    }

    @Override
    public List<UserApplyResourceVO> selectByFlag(Integer flag) {
        List<UserApplyResourceVO> userApplyResourceVOS = applyresourceMapper.selectByFlag(flag);
        return userApplyResourceVOS;
    }

}
